package appvideo;

import appvideo.logica.Alquiler;
import appvideo.logica.Caja;
import appvideo.logica.Pelicula;
import appvideo.logica.Producto;
import appvideo.logica.ProductoAlquilado;
import appvideo.logica.Promociones;
import appvideo.logica.PromocionesDiasSemana;
import appvideo.logica.PromocionesGenero;
import appvideo.logica.PromocionesMasPorMenos;
import appvideo.logica.PromocionesPuntos;
import appvideo.logica.Recargo;
import appvideo.logica.Socio;
import appvideo.logica.Videojuego;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.management.timer.Timer;


public class SubMenu_gestionAlquileres{
    public static void gestionAlquileres(){
        //Menu gestionAlquileres
        //Devolucion sera cuando hagamos las operaciones necesarias para terminar un alquiler
        //Visualizar Alquiler->Visualiza alquiler en curso de un cliente
        int opc_selec_alq=0;
        do{
            try{ //MENU GESTION ALQUILER
            opc_selec_alq = ObtenerTeclado.dameEntero("\nSeleccione opcion:\n1.Nuevo Alquiler\n2.Efectua Devolucion(de todos los productos)\n3.Visualiza Alquiler"
                        + "\n4.Buscar Alquiler\n5.Modificar Alquiler(Cambiar los productos del cliente)\n6.Anula Alquiler\n7.Volver\n8.Salir");
            switch(opc_selec_alq){
                case 1: //NUEVO ALQUILER
                        int codigoProducto=0;
                        int tipoProducto;//Pelicula o Videojuego
                        Alquiler alquiler=null;
                        ArrayList<ProductoAlquilado> lpa= new ArrayList<ProductoAlquilado>();
                        List<Producto> lp = null;
                        int selector=0;
                        Socio s = Socio.buscaUsuario(ObtenerTeclado.dameCadena("Introduzca DNI socio:"));
     
                        if(s==null){
                            System.out.println("Error: No se pudo encontrar socio en la Base de Datos");
                            opc_selec_alq=0;
                        }else{
                            if(Alquiler.buscaAlquiler(s.getDni())==null){
                                try{
                                    do{
                                        tipoProducto=ObtenerTeclado.dameEntero("Seleccione opcion:\n1.Añadir Pelicula\n2.Añadir Videojuego\n5.Confirmar Alquiler\n0.Cancelar Alquiler\n");
                                        if(tipoProducto==0){ //CANCELAR ALQUILER(hacerlo en curso)
                                            codigoProducto=-1;
                                            opc_selec_alq=0;
                                        }else if(tipoProducto==1 || tipoProducto==2){
                                            if(tipoProducto==1){
                                                Producto p = new Pelicula();
                                                System.out.println("Peliculas disponibles para alquiler:");
                                                //El selector no se puede poner,porque impide
                                                //que cuando se cambia el añadir de videojuego 
                                                //a pelicula o viceversa, da error al no
                                                //poder castearse
                                                //if(selector==0){
                                                    lp = p.visualizarProductos();
                                                //    selector=1;
                                                //
                                                for(Producto p2 : lp){
                                                    System.out.println(((Pelicula)p2).toString());
                                                }
                                            }else if(tipoProducto==2){
                                                Producto p = new Videojuego();
                                                System.out.println("Videojuegos disponibles para alquiler:");
                                                //if(selector==0){
                                                    lp = p.visualizarProductos();
                                               //     selector=1;
                                               //}
                                                for(Producto p2 : lp){
                                                    System.out.println(((Videojuego)p2).toString());
                                                }
                                            }
                                             try{//BUCLE QUE DEVUELVE PRODUCTOS POR SU CODIGO HASTA QUE SE INTRODUZCA UN CERO
                                                if(codigoProducto>=0){ //Si es -1 no entra aqui
                                                    codigoProducto=ObtenerTeclado.dameEntero("\nInserte codigo producto a alquilar:");

                                                    //1º Crear producto desde base de datos con el codigo dado
                                                    //2º Crear producto alquilado a partir del producto
                                                    //3º Crear lista de productos alquilados
                                                    //4º Crear Socio para el Alquiler
                                                    Producto p=null;//Producto creado para el po
                                                    if(tipoProducto==1){//CODIGO PARA BUSQUEDA DE PELICULAS
                                                        p = new Pelicula();
                                                        p = p.buscaProducto(new Pelicula(), codigoProducto);

                                                    }else if(tipoProducto==2){//CODIGO PARA BUSQUEDA DE VIDEOJUEGOS
                                                        p = new Videojuego();
                                                        p = p.buscaProducto(new Videojuego(), codigoProducto);
                                                    }
                                                    Date d = new Date();
                                                    //3 dias para que la devolucion no tenga recargo
                                                    ProductoAlquilado pa = new ProductoAlquilado(p,d,new Date(d.getTime() + 3 * Timer.ONE_DAY),null);
                                                    lp.remove(p);
                                                    lpa.add(pa);


                                                }
                                            }catch(NumberFormatException nme){
                                                System.out.println("Error: Debe introducir un numero");
                                            }
                                        }else if(tipoProducto==5){
                                                //CONFIRMAR Y REALIZAR ALQUILER
                                            if(lpa.isEmpty()){
                                                System.out.println("Error: No ha seleccionado ningun producto"); 
                                            }else{
                                                codigoProducto=-1;
                                                opc_selec_alq=0;

                                                //En caso de que haya promociones disponibles
                                                System.out.println("Elija la promocion de la lista de promociones disponibles:");
                                                
                                                Promociones promo=null;
                                                String opcPromo="";
                                                String id_promo="";
                                                //<----------------------------------------AQUI VA EL MENU PROMOCIONES ------------------------------->
                                                do{
                                                    Promociones.visualizarPromocionesActivasTodas();
                                                    try{
                                                        opcPromo = ObtenerTeclado.dameCadena("\nSeleccione tipo Promocion: \t1.Dia Feliz\t2.Genero\n\t\t\t\t3.Mas por menos\t4.Puntos\n\t\t\t\t5.No quiero Promocion\t0.Volver Atras");
                                                        if(opcPromo.equals("1") || opcPromo.equals("2") || opcPromo.equals("3") || opcPromo.equals("4")){
                                                            id_promo = ObtenerTeclado.dameCadena("Introduzca codigo promocion(numerico): ");
                                                            Integer.parseInt(id_promo);
                                                        }
                                                    }catch(NumberFormatException nme){
                                                        System.out.println("Error: ");
                                                        opcPromo = "10";//Valor erroneo para repetir menu
                                                    }
                                                    
                                                    if(opcPromo.equals("1")){
                                                        promo=PromocionesDiasSemana.buscaPromocion(id_promo);//Implementar seleccion de la promocion
                                                    }
                                                    else if(opcPromo.equals("2")){
                                                        promo=PromocionesGenero.buscaPromocion(id_promo);//Implementar seleccion de la promocion
                                                    }
                                                    else if(opcPromo.equals("3")){
                                                        promo=PromocionesMasPorMenos.buscaPromocion(id_promo);//Implementar seleccion de la promocion
                                                    }
                                                    else if(opcPromo.equals("4")){
                                                        promo=PromocionesPuntos.buscaPromocion(id_promo);//Implementar seleccion de la promocion
                                                    }
                                                    else if(opcPromo.equals("5")){
                                                        promo=null;
                                                    }
                                                    else if(opcPromo.equals("0")){
                                                        opc_selec_alq=0;
                                                    }else{
                                                        System.out.println("Tipo de Promocion incorrecta");
                                                    }
                                                }while(!opcPromo.equals("0") && !opcPromo.equals("1") && !opcPromo.equals("2") && 
                                                        !opcPromo.equals("3") && !opcPromo.equals("4") && !opcPromo.equals("5"));
                                                
                                                double costeAlquiler = 0.00;
                                                if(promo==null){
                                                    costeAlquiler = 0.00;

                                                    for(ProductoAlquilado pa : lpa){//Calculo CosteAlquiler(Sin aplicar la promocion)
                                                        costeAlquiler = costeAlquiler + pa.getProducto().getTarifa().getPrecio();
                                                    }
                                                }else{
                                                    if(promo instanceof PromocionesPuntos){
                                                        int opcPuntos=0;
                                                        do{
                                                            opcPuntos=ObtenerTeclado.dameEntero("¿Desea usar sus puntos para el descuento?(1.Si/2.No)");
                                                            if(opcPuntos==1){
                                                                ((PromocionesPuntos)promo).setAplicar(true);
                                                            }else if(opcPuntos==2){
                                                                System.out.println("Sus puntos se guardaran para futuras promociones(No olvide gastarlos mientras esta promocion siga activa)");
                                                            }else{
                                                                System.out.println("Error con la opcion elegida");
                                                            }
                                                        }while(opcPuntos!=1 && opcPuntos!=2);
                                                    }
                                                    costeAlquiler = promo.damePrecio(lpa,s);
                                                }
                                                //Ahora creariamos el objeto alquiler
                                                alquiler = new Alquiler(costeAlquiler,main.usuarioActual,lpa,s,promo);
                                                
                                                
                                                //CONEXION A BASE DE DATOS(PASANDO POR LA LOGICA)
                                                try{
                                                    alquiler.altaAlquiler();
                                                }catch(Exception e){
                                                    System.out.println("Error:"+e.getMessage());
                                                    opc_selec_alq=0;
                                                }
                                            }
                                        }else{
                                            System.out.println("Opcion erronea.");
                                        }
                                        //tipoProducto>0 (Por si quieres cancelar el alquiler en el proceso)
                                    }while(codigoProducto!= -1);
                                }catch(NumberFormatException nme){
                                    System.out.println("Debe seleccionar 1 o 2.");
                                }
                            }else{
                                System.out.println("Error: No se puede crear un alquiler. Socio de dni "+s.getDni()+" ya tiene un alquiler en curso");
                            }
                        }
                    main.opc=0;
                    break;
                case 2: //DEVOLUCIONES
                    alquiler = Alquiler.buscaAlquiler(ObtenerTeclado.dameCadena("Introduzca Dni Socio: "));
                    if(alquiler!=null){
                        //Date fDevolucion = new Date();
                        System.out.println(alquiler.visualizaProductosAlquiler(alquiler.getProductosAlquilados()));
                        codigoProducto=0;
                        do{
                            try{
                               codigoProducto=ObtenerTeclado.dameEntero("1.Confirmar Devolucion de todos los Productos\n0.Volver atras.");
                                if(codigoProducto==1){
                                    //Realizar todas las devoluciones
                                    if(alquiler.devolucionProductosCompleta()){
                                        System.out.println("Devolucion completada");
                                        //si la devolucion se completa correctamente se procede a comprobar el posible recargo
                                        //nos creamos un objeto recargo
                                        Recargo recargo=new Recargo();
                                        //variable que recoge el recargo si es que lo hay
                                        double rec;
                                        rec=recargo.compruebaRecargoColectivo(alquiler.getProductosAlquilados());
                                        if(rec>0){
                                            //en caso de que conlleve recargo se notifica y se registra en la caja
                                            System.out.println("El alquiler tiene un recargo de: "+rec+"€");
                                            Caja caja = new Caja(rec,alquiler.getSocio().getId(),"Recargo");
                                            caja.registraNuevoUso();
                                        }
                                        else{
                                            System.out.println("El alquiler no conlleva recargo");
                                        }
                                    }else{
                                        System.out.println("Devolucion no realizada");
                                    }
                                }else if(codigoProducto==0){
                                    //Volver atras
                                    opc_selec_alq=0;
                                }else{
                                    System.out.println("Opcion incorrecta.");
                                }
                            }catch(NumberFormatException nme){
                                System.out.println("Error: "+nme.getMessage());
                                codigoProducto=-1; //pongo un error adrede para repetir bucle
                            }
                        }while(codigoProducto!=1 && codigoProducto!=0);
                    }
                    main.opc=0;
                    break;
                case 3://VISUALIZA ALQUILER
                    String opcionVisualizar="";
                    do{
                        opcionVisualizar = ObtenerTeclado.dameCadena("1.Visualizar alquileres en curso\n2.Visualizar Alquileres Caducados\n0.Volver Atras");
                        if(opcionVisualizar.equals("1")){
                            //VISUALIZAR ALQUILERES EN CURSO
                            List<Alquiler> alquileres = Alquiler.getAlquileres(1);
                            if(!alquileres.isEmpty()){
                                for(Alquiler a : alquileres){
                                    System.out.println(a.toString());
                                    System.out.println("\n");
                                }
                            }else{
                                System.out.println("No hay alquileres en curso");
                            }
                        }else if(opcionVisualizar.equals("2")){
                            //VISUALIZAR ALQUILERES CADUCADOS
                            //Alquileres caducados son aquellos que tienen algun productoAlquilado pasado de fecha
                            List<Alquiler> alquileres = Alquiler.getAlquileres(2);
                            if(!alquileres.isEmpty()){
                                for(Alquiler a : alquileres){
                                    System.out.println(a.toString());
                                    System.out.println("\n");
                                }
                            }else{
                                System.out.println("No hay alquileres caducados");
                            }
                            
                        }else if(opcionVisualizar.equals("0")){
                            opc_selec_alq=0;
                        }else{
                            System.out.println("Opcion incorrecta.");
                        }
                    }while(!opcionVisualizar.equals("1") && !opcionVisualizar.equals("0") && !opcionVisualizar.equals("0"));
                    main.opc=0;
                    break;
                case 4://BUSCA
                    alquiler = Alquiler.buscaAlquiler(ObtenerTeclado.dameCadena("Introduzca Dni Socio: "));
                    if(alquiler!=null){
                        System.out.println(alquiler.toString());
                    }
                    main.opc=0;
                    break;
                case 5://MODIFICA ALQUILER
                    alquiler = Alquiler.buscaAlquiler(ObtenerTeclado.dameCadena("Introduzca Dni Socio: "));
                    if(alquiler!=null){
                        int opcionModifica=0;
                        do{
                            try{
                                opcionModifica = ObtenerTeclado.dameEntero("Seleccione:\n1.Añadir Producto\n2.Devolver Producto\n3.Prolongar Producto\n0.Volver Atras");
                                if(opcionModifica==1){//AÑADIR PELICULA
                                    do{
                                        tipoProducto=ObtenerTeclado.dameEntero("Seleccione opcion:\n1.Añadir Pelicula\n2.Añadir Videojuego\n0.Volver Atras");
                                        if(tipoProducto==1 || tipoProducto==2){
                                            if(tipoProducto==1){
                                                Producto p = new Pelicula();
                                                System.out.println("Peliculas disponibles para alquiler:");
                                                for(Producto p2 : p.visualizarProductos()){
                                                    System.out.println(((Pelicula)p2).toString());
                                                }
                                                
                                            }else if(tipoProducto==2){
                                                Producto p = new Videojuego();
                                                System.out.println("Videojuegos disponibles para alquiler:");
                                                for(Producto p2 : p.visualizarProductos()){
                                                    System.out.println(((Videojuego)p2).toString());
                                                }
                                            }
                                            codigoProducto=ObtenerTeclado.dameEntero("\nInserte codigo producto a buscar:");
                                            Producto p=null;
                                            if(tipoProducto==1){//CODIGO PARA BUSQUEDA DE PELICULAS
                                                p = new Pelicula();
                                                p = p.buscaProducto(new Pelicula(), codigoProducto);

                                            }else if(tipoProducto==2){//CODIGO PARA BUSQUEDA DE VIDEOJUEGOS
                                                p = new Videojuego();
                                                p = p.buscaProducto(new Videojuego(), codigoProducto);
                                            }
                                            Date d = new Date();
                                            //3 dias para que la devolucion no tenga recargo
                                            ProductoAlquilado pa = new ProductoAlquilado(p,d,new Date(d.getTime() + 3 * Timer.ONE_DAY),null);
                                            alquiler.getProductosAlquilados().add(pa);
                                            
                                            //Y ahora me voy a la base de datos a insertar el nuevo producto
                                            alquiler.insertaNuevoProductoAlquilado(pa);
                                            opc_selec_alq=0;
                                        }
                                    }while(tipoProducto< 0 && tipoProducto>2);
                                }else if(opcionModifica==2){//DEVOLUCION PELICULA
                                    System.out.println(alquiler.visualizaProductosAlquiler(alquiler.getProductosAlquilados()));
                                    boolean correcto=false;
                                    try{
                                        do{
                                            String tipoP= ObtenerTeclado.dameCadena("Seleccione tipo de producto(v->Videojuego o p->Pelicula):");
                                            int quitaPelicula = ObtenerTeclado.dameEntero("\nSeleccione el codigo del producto:");
                                            if(tipoP.length()==1){
                                                if(tipoP.charAt(0)=='v' || tipoP.charAt(0)=='p'){
                                                    if(alquiler.devolucionProducto(quitaPelicula, tipoP,alquiler.getSocio().getId())){
                                                        System.out.println("Producto eliminado de la lista de alquileres");
                                                        if(alquiler.getProductosAlquilados().isEmpty()){
                                                            System.out.println("Alquiler finalizado");
                                                            opc_selec_alq=0;
                                                        }
                                                    }else{
                                                        System.out.println("Producto no encontrado en la lista de alquileres");
                                                    }
                                                    correcto=true;
                                                }else{
                                                    System.out.println("No puede introducir caracteres diferentes de 'p' o 'v'");
                                                }
                                            }else{
                                                System.out.println("No se puede introducir mas de un caracter");
                                            }
                                        }while(!correcto);
                                    }catch(NumberFormatException pe){
                                        System.out.println("Error: "+pe.getMessage());
                                    }
                                }else if(opcionModifica==3){
                                    //Prolongar alquiler
                                    System.out.println(alquiler.visualizaProductosAlquiler(alquiler.getProductosAlquilados()));
                                    boolean correcto=false;
                                    try{
                                        do{
                                            String tipoP= ObtenerTeclado.dameCadena("Seleccione tipo de producto(v->Videojuego o p->Pelicula):");
                                            int quitaPelicula = ObtenerTeclado.dameEntero("\nSeleccione el codigo del producto:");
                                            if(tipoP.length()==1){
                                                if(tipoP.charAt(0)=='v' || tipoP.charAt(0)=='p'){
                                                    boolean encontrado=false;
                                                    correcto=true;
                                                    //Itero por la lista de productos alquilados(ya extraida de la BD)
                                                    //para comprobar si el producto coincide con los criterios de busqueda
                                                    Iterator it = alquiler.getProductosAlquilados().iterator();
                                                    while(it.hasNext()){
                                                        ProductoAlquilado pAlq = (ProductoAlquilado)it.next();
                                                        SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
                                                        if(tipoP.charAt(0)=='v' && pAlq.getProducto() instanceof Videojuego && quitaPelicula==pAlq.getProducto().getCodigo()){
                                                            //prolongo el alquiler(Caso videojuego), lo hago en la logica y en la BD
                                                            Date nuevaFechaFin = new Date(pAlq.getfFin().getTime() + 3 * Timer.ONE_DAY);
                                                            pAlq.setfFin(nuevaFechaFin);
                                                            if(alquiler.prolongarProductoAlquilado(pAlq)){
                                                                System.out.println("Prologacion fecha entrega realizada: Producto "+pAlq.getProducto().getNombre()+ " a "+dt.format(pAlq.getfFin()));
                                                                //GENERAR PAGO
                                                            }
                                                            encontrado=true;
                                                            opcionModifica=-1;
                                                        }else if(tipoP.charAt(0)=='p' && pAlq.getProducto() instanceof Pelicula && quitaPelicula==pAlq.getProducto().getCodigo()){
                                                            //prolongo el alquiler(Caso pelicula), lo hago en la logica y en la BD
                                                            Date nuevaFechaFin = new Date(pAlq.getfFin().getTime() + 3 * Timer.ONE_DAY);
                                                            pAlq.setfFin(nuevaFechaFin);
                                                            if(alquiler.prolongarProductoAlquilado(pAlq)){
                                                                System.out.println("Prologacion fecha entrega realizada: Producto "+pAlq.getProducto().getNombre()+ " a "+dt.format(pAlq.getfFin()));
                                                                
                                                            }
                                                            encontrado=true;
                                                            opcionModifica=-1;
                                                        }
                                                    }
                                                    if(!encontrado){
                                                        System.out.println("Codigo de producto no encontrado o no corresponde con el tipo introducido");
                                                        opcionModifica=-1;
                                                    }
                                                }else{
                                                    System.out.println("No puede introducir caracteres diferentes de 'p' o 'v'");
                                                }
                                            }else{
                                                System.out.println("No se puede introducir mas de un caracter");
                                            }
                                        }while(!correcto);
                                    }catch(NumberFormatException pe){
                                        System.out.println("Error: "+pe.getMessage());
                                    }
                                }else if(opcionModifica==0){
                                    opc_selec_alq=0;
                                }else{
                                    System.out.println("Opcion incorrecta");
                                }
                            }catch(NumberFormatException nme){
                                System.out.println("Error: "+nme.getMessage());
                            }
                        }while(alquiler.getProductosAlquilados().size()>0 && (opcionModifica!=1 && opcionModifica!=2 && opcionModifica!=3 && opcionModifica!=0));
                    }
                    main.opc=0;
                    break;
                case 6: //ANULAR ALQUILER
                    alquiler = Alquiler.buscaAlquiler(ObtenerTeclado.dameCadena("Introduzca Dni Socio: "));
                    if(alquiler!=null){
                        System.out.println(alquiler.toString());
                        if(ObtenerTeclado.dameCadena("ATENCION, esta a punto de borrar para siempre registros de la Base de Datos\nPulse 1 para confirmar y cualquier otra tecla para cancelar").equals("1")){
                            if(alquiler.anulaAlquiler())
                                System.out.println("Alquiler anulado");
                            else
                                System.out.println("Alquiler no anulado");
                        }else{
                            System.out.println("Anulacion cancelada");
                        }
                    }
                    main.opc=0;
                    break;
                case 7: //VOLVER
                    main.opc=0;
                    break;
                case 8:
                    //SALIR
                    break;
                default:
                    break;
            }
            }catch(NumberFormatException nme){
                System.out.println("Error: Debe introducir un numero");
            }catch(Exception e){
                System.out.println("Error: "+e.getMessage());
            }
        }while(opc_selec_alq<1 || opc_selec_alq>8);
    }
} 
           
